/* eslint-disable no-unused-expressions */
/*
0.强度映射 低：1 中：2 强：3 极强：4
1.密码位数小于8位 -- 低强度
2.在字典里面能找到 -- 低强度
3.数字/小写字母/大写字母/特殊字符 每项包含各得1分， 总分4分， 分为 弱/中/强/极强/ 4个等级
*/
import dictMap from './dict';

const regMap = {
  digit: /[0-9]/, // 数字
  lower: /[a-z]/, // 小写字母
  upper: /[A-Z]/, // 大写字母
  punct: /[`~!@#$%^&*()_\-+=<>?:"{}|,./;'\\[\]·]/, // 特殊字符
};

// 是否包含某规则
const containsRegular = (str: any, reg: any) => {
  return reg.test(str);
};

// 是否为空值
const isNullValue = (val: any) => {
  const value = val.replace(/\s/g, '');
  return value === null || value === undefined || value === '';
};

// 获取分数
const getScore = (val: any) => {
  let level = 0;
  const isDigit = containsRegular(val, regMap.digit); // 是否含有数字
  const isLower = containsRegular(val, regMap.lower); // 是否含有小写字母
  const isUpper = containsRegular(val, regMap.upper); // 是否含有大写字母
  const isPunct = containsRegular(val, regMap.punct); // 是否含有特殊字符
  const list = [isDigit, isLower, isUpper, isPunct];

  list.forEach((item) => {
    item && ++level;
  });

  return level;
};

// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
export const getPwdStrength = (val: any) => {
  if (isNullValue(val)) return 0;
  if (val.length < 8) return 1;
  if ((dictMap as any)[val]) return 1;

  return getScore(val);
};
